home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 November: Tool Chest / Dev.CD Nov 98 TC.toast / Sample Code / Snippets / Toolbox / Notification Hacks / NotificationTrash.ƒ / NotificationTrash.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-04  |  2.5 KB  |  132 lines  |  [TEXT/KAHL]

  1. #ifndef THINK_C
  2.     #include <GestaltEQU.h>
  3.     #include <OSUtils.h>
  4.     #include <Notification.h>
  5.     #include <Resources.h>
  6. #endif
  7.  
  8.     #include <Traps.h>
  9.     #include <gestaltEQU.h>
  10.  
  11.     #include <GestaltTalk.h>
  12.     
  13.  
  14. OSErr ShowInitIcon( short icon_num, short move_x_by);
  15. pascal void EndUpdateEntry(WindowPtr wp);
  16. long  *GetStashSpotAddr();
  17. gtp *GetGTAddr();
  18.  
  19. pascal void main()
  20. {
  21.     Handle            initCodeHandle;
  22.     long            *localRealAddr;
  23.     gtp                *gtPointer;
  24.     short            err = 0;
  25.     long            sysVersion;
  26.     GestaltTalkPB    gpb;
  27.     
  28.     /* don't load unless we are on 7.0 or later */
  29.     err = Gestalt(gestaltSystemVersion,&sysVersion);
  30.     if(sysVersion < 0x0700)    return;
  31.     
  32.     initCodeHandle = Get1Resource('INIT',0);
  33.     DetachResource(initCodeHandle);
  34.  
  35.     localRealAddr = GetStashSpotAddr();
  36.     
  37.     *localRealAddr = GetToolTrapAddress( (short)_EndUpDate );
  38.     SetToolTrapAddress((long)EndUpdateEntry, (short)_EndUpDate);
  39.  
  40.     gpb.command = guserinit;
  41.     gpb.datalength = 0;
  42.     gpb.data = nil;
  43.     gpb.gtData = nil;
  44.     
  45.     err = GestaltTalk(&gpb);
  46.     if(err) {
  47.         DebugStr("\pError, gestaltTalk guserinit failed.");
  48.         *localRealAddr = 0;
  49.         return;
  50.     }
  51.     
  52.     gtPointer = GetGTAddr();
  53.     *gtPointer = gpb.gtData;
  54.  
  55.     (void) ShowInitIcon( 128, -1);
  56. }
  57.  
  58. void NotificationTrash(WindowPeek wp)
  59. {
  60.     GestaltTalkPB    gpb;
  61.     gtp                gdata;
  62.     short            err = 0;
  63.     FontInfo        fi;
  64.     Rect            drawRect;
  65.     short            lineHt;
  66.     
  67.     gdata = *GetGTAddr();
  68.  
  69.     if(gdata->buffCount)
  70.         if( EqualString("\pTrash", *(wp->titleHandle), false, false) ) {
  71.             GetFontInfo(&fi);
  72.             lineHt = fi.ascent + fi.descent + fi.leading;
  73.  
  74.             drawRect = wp->port.portRect;
  75.             
  76.             drawRect.top += lineHt + 32;
  77.             drawRect.left += 2;
  78.             drawRect.bottom -= 17;
  79.             drawRect.right -= 17;
  80.             
  81.             EraseRect(&drawRect);
  82.  
  83.             drawRect.bottom = drawRect.top + lineHt;
  84.             
  85.             MoveTo(drawRect.left,drawRect.bottom);
  86.             DrawString(gdata->dataBuffer);
  87.         }
  88.     
  89. }
  90.  
  91. pascal void EndUpdateEntry(WindowPtr wp)
  92. {
  93.     
  94.     asm    {            
  95.             move.l    wp,-(sp)
  96.             jsr     NotificationTrash
  97.             addq.l    #4,sp
  98.  
  99. @callOriginal
  100.             jsr        GetStashSpotAddr                // get pointer to real NMinstall address
  101.             movea.l    d0,a0                            // get pointer to storage
  102.             move.l    (a0),a0                            // save addr of NMInstall             
  103.             unlk    a6
  104.             jmp     (a0)                            // push address of real NMInstall on stack
  105.                                                     // let the RTS take us there...
  106.     }
  107. }
  108.  
  109.  
  110. long *GetStashSpotAddr()
  111. {
  112.     asm {
  113.             bsr.s @skipStorage
  114.             dc.l    0x00            // pointer to real EndUpdate
  115.             dc.l    0x00            // gestaltTalk gtData
  116.         @skipStorage:
  117.             move.l    (sp)+,d0
  118.     }
  119. }
  120.  
  121. gtp *GetGTAddr()
  122. {
  123.     asm {
  124.             bsr.s @skipStorage
  125.             dc.l    0x00            // gestaltTalk gtData
  126.             dc.l    0x00            
  127.         @skipStorage:
  128.             move.l    (sp)+,d0
  129.     }
  130. }
  131.  
  132.